#!/bin/bash

# 资产管理系统 - 系统监控脚本
# 版本: 1.0

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 配置变量
APP_DIR="/opt/asset-management"
LOG_DIR="/var/log/asset-management"

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 显示使用方法
show_usage() {
    echo "使用方法: $0 [选项]"
    echo "选项:"
    echo "  -s, --status          显示服务状态"
    echo "  -l, --logs [service]  查看日志 (可选服务: web, db, redis, nginx, celery)"
    echo "  -m, --metrics         显示系统指标"
    echo "  -h, --health          执行健康检查"
    echo "  -c, --containers      显示容器信息"
    echo "  -r, --resources       显示资源使用情况"
    echo "  -w, --watch           实时监控模式"
    echo "  --help                显示帮助信息"
    echo
    echo "示例:"
    echo "  $0 -s                 # 显示服务状态"
    echo "  $0 -l web             # 查看Web服务日志"
    echo "  $0 -m                 # 显示系统指标"
    echo "  $0 -w                 # 实时监控"
}

# 检查环境
check_environment() {
    if [[ ! -d "$APP_DIR" ]]; then
        log_error "应用目录不存在: $APP_DIR"
        exit 1
    fi
    
    cd "$APP_DIR"
}

# 显示服务状态
show_service_status() {
    log_info "=== 服务状态 ==="
    echo
    
    # Docker Compose服务状态
    if docker-compose ps 2>/dev/null; then
        echo
    else
        log_error "无法获取Docker Compose服务状态"
        return 1
    fi
    
    # 检查各个服务的健康状态
    local services=("asset_nginx" "asset_web" "asset_db" "asset_redis" "asset_celery")
    
    echo "详细健康状态:"
    for service in "${services[@]}"; do
        if docker ps --format "table {{.Names}}\t{{.Status}}" | grep -q "$service.*Up"; then
            log_success "$service: 运行正常"
        else
            log_error "$service: 运行异常"
        fi
    done
}

# 查看日志
show_logs() {
    local service="$1"
    local lines="${2:-100}"
    
    log_info "=== 查看日志 ==="
    
    if [[ -z "$service" ]]; then
        log_info "显示所有服务日志 (最近 $lines 行):"
        docker-compose logs --tail="$lines" -t
    else
        case "$service" in
            web|nginx|db|redis|celery|celery-beat|prometheus|grafana)
                log_info "显示 $service 服务日志 (最近 $lines 行):"
                docker-compose logs --tail="$lines" -t "$service"
                ;;
            *)
                log_error "不支持的服务: $service"
                log_info "支持的服务: web, nginx, db, redis, celery, celery-beat, prometheus, grafana"
                return 1
                ;;
        esac
    fi
}

# 显示系统指标
show_metrics() {
    log_info "=== 系统指标 ==="
    echo
    
    # 系统资源使用情况
    log_info "系统资源使用情况:"
    echo "CPU使用率:"
    top -bn1 | grep "Cpu(s)" | awk '{print $2 $3}' | awk -F'%' '{print $1"%"}'
    
    echo "内存使用情况:"
    free -h | grep -E "^Mem|^Swap"
    
    echo "磁盘使用情况:"
    df -h | grep -E "^/dev|^Filesystem"
    
    echo
    
    # Docker容器资源使用
    log_info "容器资源使用情况:"
    docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"
    
    echo
    
    # 数据库连接数
    log_info "数据库连接数:"
    local db_connections=$(docker-compose exec -T db mysql -u root -p123456 -e "SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null | tail -1 | awk '{print $2}' || echo "N/A")
    echo "当前连接数: $db_connections"
    
    # Redis信息
    log_info "Redis信息:"
    local redis_info=$(docker-compose exec -T redis redis-cli info memory 2>/dev/null | grep "used_memory_human" | cut -d: -f2 | tr -d '\r' || echo "N/A")
    echo "内存使用: $redis_info"
}

# 执行健康检查
health_check() {
    log_info "=== 健康检查 ==="
    echo
    
    local all_healthy=true
    
    # 检查Web服务
    log_info "检查Web服务..."
    if curl -s -o /dev/null -w "%{http_code}" http://localhost/health/ | grep -q "200"; then
        log_success "Web服务: 健康"
    else
        log_error "Web服务: 异常"
        all_healthy=false
    fi
    
    # 检查数据库
    log_info "检查数据库..."
    if docker-compose exec -T db mysql -u root -p123456 -e "SELECT 1" >/dev/null 2>&1; then
        log_success "数据库: 健康"
    else
        log_error "数据库: 异常"
        all_healthy=false
    fi
    
    # 检查Redis
    log_info "检查Redis..."
    if docker-compose exec -T redis redis-cli ping | grep -q "PONG"; then
        log_success "Redis: 健康"
    else
        log_error "Redis: 异常"
        all_healthy=false
    fi
    
    # 检查磁盘空间
    log_info "检查磁盘空间..."
    local disk_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
    if [[ $disk_usage -lt 80 ]]; then
        log_success "磁盘空间: 正常 (${disk_usage}%)"
    elif [[ $disk_usage -lt 90 ]]; then
        log_warning "磁盘空间: 警告 (${disk_usage}%)"
    else
        log_error "磁盘空间: 危险 (${disk_usage}%)"
        all_healthy=false
    fi
    
    # 检查内存使用
    log_info "检查内存使用..."
    local mem_usage=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100.0}')
    if [[ $mem_usage -lt 80 ]]; then
        log_success "内存使用: 正常 (${mem_usage}%)"
    elif [[ $mem_usage -lt 90 ]]; then
        log_warning "内存使用: 警告 (${mem_usage}%)"
    else
        log_error "内存使用: 危险 (${mem_usage}%)"
        all_healthy=false
    fi
    
    echo
    if [[ "$all_healthy" == "true" ]]; then
        log_success "整体健康状态: 良好"
    else
        log_error "整体健康状态: 异常"
    fi
}

# 显示容器信息
show_containers() {
    log_info "=== 容器信息 ==="
    echo
    
    # 容器列表
    log_info "运行中的容器:"
    docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
    
    echo
    
    # 容器详细信息
    log_info "容器详细信息:"
    local containers=$(docker-compose ps -q)
    
    for container_id in $containers; do
        local container_name=$(docker inspect --format='{{.Name}}' "$container_id" | sed 's/\///')
        local container_image=$(docker inspect --format='{{.Config.Image}}' "$container_id")
        local container_created=$(docker inspect --format='{{.Created}}' "$container_id" | cut -d'T' -f1)
        
        echo "容器: $container_name"
        echo "  镜像: $container_image"
        echo "  创建时间: $container_created"
        echo "  重启次数: $(docker inspect --format='{{.RestartCount}}' "$container_id")"
        echo
    done
}

# 显示资源使用情况
show_resources() {
    log_info "=== 资源使用情况 ==="
    echo
    
    # 系统负载
    log_info "系统负载:"
    uptime
    
    echo
    
    # CPU信息
    log_info "CPU信息:"
    lscpu | grep -E "^CPU\(s\)|^Model name|^CPU MHz"
    
    echo
    
    # 内存详细信息
    log_info "内存详细信息:"
    cat /proc/meminfo | grep -E "^MemTotal|^MemFree|^MemAvailable|^Buffers|^Cached"
    
    echo
    
    # 网络连接
    log_info "网络连接统计:"
    ss -s
    
    echo
    
    # 进程信息
    log_info "资源占用最高的进程:"
    ps aux --sort=-%cpu | head -10
}

# 实时监控模式
watch_mode() {
    log_info "=== 实时监控模式 ==="
    log_info "按 Ctrl+C 退出监控"
    echo
    
    while true; do
        clear
        echo "资产管理系统实时监控 - $(date)"
        echo "=================================="
        
        # 显示关键指标
        echo "服务状态:"
        docker-compose ps 2>/dev/null | grep -E "asset_" | awk '{print $1 "\t" $2}'
        
        echo
        echo "系统资源:"
        echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2 $3}' | awk -F'%' '{print $1"%"}')"
        echo "内存: $(free | grep Mem | awk '{printf "%.1f%%", $3/$2 * 100.0}')"
        echo "磁盘: $(df / | tail -1 | awk '{print $5}')"
        
        echo
        echo "容器资源:"
        docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" | head -6
        
        echo
        echo "最近的错误日志:"
        docker-compose logs --tail=3 2>/dev/null | grep -i error | tail -3 || echo "无错误日志"
        
        sleep 5
    done
}

# 主函数
main() {
    check_environment
    
    case "${1:-}" in
        -s|--status)
            show_service_status
            ;;
        -l|--logs)
            show_logs "$2" "$3"
            ;;
        -m|--metrics)
            show_metrics
            ;;
        -h|--health)
            health_check
            ;;
        -c|--containers)
            show_containers
            ;;
        -r|--resources)
            show_resources
            ;;
        -w|--watch)
            watch_mode
            ;;
        --help)
            show_usage
            ;;
        "")
            # 默认显示概览信息
            show_service_status
            echo
            health_check
            ;;
        *)
            log_error "未知选项: $1"
            show_usage
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"